home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / include / fuse / fuse_lowlevel.h < prev    next >
C/C++ Source or Header  |  2006-05-11  |  37KB  |  1,259 lines

  1. /*
  2.     FUSE: Filesystem in Userspace
  3.     Copyright (C) 2001-2006  Miklos Szeredi <miklos@szeredi.hu>
  4.  
  5.     This program can be distributed under the terms of the GNU LGPL.
  6.     See the file COPYING.LIB.
  7. */
  8.  
  9. #ifndef _FUSE_LOWLEVEL_H_
  10. #define _FUSE_LOWLEVEL_H_
  11.  
  12. /* =========================================================== *
  13.  * Low level API                                               *
  14.  * =========================================================== */
  15.  
  16. /* IMPORTANT: you should define FUSE_USE_VERSION before including this
  17.    header.  To use the newest API define it to 25 (recommended for any
  18.    new application), to use the old API define it to 24 (default) */
  19.  
  20. #ifndef FUSE_USE_VERSION
  21. #define FUSE_USE_VERSION 24
  22. #endif
  23.  
  24. #include "fuse_common.h"
  25.  
  26. #include <utime.h>
  27. #include <sys/types.h>
  28. #include <sys/stat.h>
  29. #include <sys/statvfs.h>
  30. #include <sys/uio.h>
  31.  
  32. #ifdef __cplusplus
  33. extern "C" {
  34. #endif
  35.  
  36. /* ----------------------------------------------------------- *
  37.  * Miscellaneous definitions                                   *
  38.  * ----------------------------------------------------------- */
  39.  
  40. /** The node ID of the root inode */
  41. #define FUSE_ROOT_ID 1
  42.  
  43. /** Inode number type */
  44. typedef unsigned long fuse_ino_t;
  45.  
  46. /** Request pointer type */
  47. typedef struct fuse_req *fuse_req_t;
  48.  
  49. /**
  50.  * Session
  51.  *
  52.  * This provides hooks for processing requests, and exiting
  53.  */
  54. struct fuse_session;
  55.  
  56. /**
  57.  * Channel
  58.  *
  59.  * A communication channel, providing hooks for sending and receiving
  60.  * messages
  61.  */
  62. struct fuse_chan;
  63.  
  64. /** Directory entry parameters supplied to fuse_reply_entry() */
  65. struct fuse_entry_param {
  66.     /** Unique inode number
  67.      *
  68.      * In lookup, zero means negative entry (from version 2.5)
  69.      * Returning ENOENT also means negative entry, but by setting zero
  70.      * ino the kernel may cache negative entries for entry_timeout
  71.      * seconds.
  72.      */
  73.     fuse_ino_t ino;
  74.  
  75.     /** The ino/generation pair should be unique for the filesystem's
  76.         lifetime */
  77.     unsigned long generation;
  78.  
  79.     /** Inode attributes */
  80.     struct stat attr;
  81.  
  82.     /** Validity timeout (in seconds) for the attributes */
  83.     double attr_timeout;
  84.  
  85.     /** Validity timeout (in seconds) for the name */
  86.     double entry_timeout;
  87. };
  88.  
  89. /** Additional context associated with requests */
  90. struct fuse_ctx {
  91.     /** User ID of the calling process */
  92.     uid_t uid;
  93.  
  94.     /** Group ID of the calling process */
  95.     gid_t gid;
  96.  
  97.     /** Thread ID of the calling process */
  98.     pid_t pid;
  99. };
  100.  
  101. /* 'to_set' flags in setattr */
  102. #define FUSE_SET_ATTR_MODE    (1 << 0)
  103. #define FUSE_SET_ATTR_UID    (1 << 1)
  104. #define FUSE_SET_ATTR_GID    (1 << 2)
  105. #define FUSE_SET_ATTR_SIZE    (1 << 3)
  106. #define FUSE_SET_ATTR_ATIME    (1 << 4)
  107. #define FUSE_SET_ATTR_MTIME    (1 << 5)
  108.  
  109. /* ----------------------------------------------------------- *
  110.  * Request methods and replies                                 *
  111.  * ----------------------------------------------------------- */
  112.  
  113. /**
  114.  * Low level filesystem operations
  115.  *
  116.  * Most of the methods (with the exception of init and destroy)
  117.  * receive a request handle (fuse_req_t) as their first argument.
  118.  * This handle must be passed to one of the specified reply functions.
  119.  *
  120.  * This may be done inside the method invocation, or after the call
  121.  * has returned.  The request handle is valid until one of the reply
  122.  * functions is called.
  123.  *
  124.  * Other pointer arguments (name, fuse_file_info, etc) are not valid
  125.  * after the call has returned, so if they are needed later, their
  126.  * contents have to be copied.
  127.  *
  128.  * The filesystem sometimes needs to handle a return value of -ENOENT
  129.  * from the reply function, which means, that the request was
  130.  * interrupted, and the reply discarded.  For example if
  131.  * fuse_reply_open() return -ENOENT means, that the release method for
  132.  * this file will not be called.
  133.  */
  134. struct fuse_lowlevel_ops {
  135.     /**
  136.      * Initialize filesystem
  137.      *
  138.      * Called before any other filesystem method
  139.      *
  140.      * There's no reply to this function
  141.      *
  142.      * @param userdata the user data passed to fuse_lowlevel_new()
  143.      */
  144.     void (*init) (void *userdata, struct fuse_conn_info *conn);
  145.  
  146.     /**
  147.      * Clean up filesystem
  148.      *
  149.      * Called on filesystem exit
  150.      *
  151.      * There's no reply to this function
  152.      *
  153.      * @param userdata the user data passed to fuse_lowlevel_new()
  154.      */
  155.     void (*destroy) (void *userdata);
  156.  
  157.     /**
  158.      * Look up a directory entry by name
  159.      *
  160.      * Valid replies:
  161.      *   fuse_reply_entry()
  162.      *   fuse_reply_err()
  163.      *
  164.      * @param req request handle
  165.      * @param parent inode number of the parent directory
  166.      * @param name the name to look up
  167.      */
  168.     void (*lookup) (fuse_req_t req, fuse_ino_t parent, const char *name);
  169.  
  170.     /**
  171.      * Forget about an inode
  172.      *
  173.      * The nlookup parameter indicates the number of lookups
  174.      * previously performed on this inode.
  175.      *
  176.      * If the filesystem implements inode lifetimes, it is recommended
  177.      * that inodes acquire a single reference on each lookup, and lose
  178.      * nlookup references on each forget.
  179.      *
  180.      * The filesystem may ignore forget calls, if the inodes don't
  181.      * need to have a limited lifetime.
  182.      *
  183.      * On unmount it is not guaranteed, that all referenced inodes
  184.      * will receive a forget message.
  185.      *
  186.      * Valid replies:
  187.      *   fuse_reply_none()
  188.      *
  189.      * @param req request handle
  190.      * @param ino the inode number
  191.      * @param nlookup the number of lookups to forget
  192.      */
  193.     void (*forget) (fuse_req_t req, fuse_ino_t ino, unsigned long nlookup);
  194.  
  195.     /**
  196.      * Get file attributes
  197.      *
  198.      * Valid replies:
  199.      *   fuse_reply_attr()
  200.      *   fuse_reply_err()
  201.      *
  202.      * @param req request handle
  203.      * @param ino the inode number
  204.      * @param fi for future use, currently always NULL
  205.      */
  206.     void (*getattr) (fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi);
  207.  
  208.     /**
  209.      * Set file attributes
  210.      *
  211.      * In the 'attr' argument only members indicated by the 'to_set'
  212.      * bitmask contain valid values.  Other members contain undefined
  213.      * values.
  214.      *
  215.      * If the setattr was invoked from the ftruncate() system call
  216.      * under Linux kernel versions 2.6.15 or later, the fi->fh will
  217.      * contain the value set by the open method or will be undefined
  218.      * if the open method didn't set any value.  Otherwise (not
  219.      * ftruncate call, or kernel version earlier than 2.6.15) the fi
  220.      * parameter will be NULL.
  221.      *
  222.      * Valid replies:
  223.      *   fuse_reply_attr()
  224.      *   fuse_reply_err()
  225.      *
  226.      * @param req request handle
  227.      * @param ino the inode number
  228.      * @param attr the attributes
  229.      * @param to_set bit mask of attributes which should be set
  230.      * @param fi file information, or NULL
  231.      *
  232.      * Changed in version 2.5:
  233.      *     file information filled in for ftruncate
  234.      */
  235.     void (*setattr) (fuse_req_t req, fuse_ino_t ino, struct stat *attr,
  236.                     int to_set, struct fuse_file_info *fi);
  237.  
  238.     /**
  239.      * Read symbolic link
  240.      *
  241.      * Valid replies:
  242.      *   fuse_reply_readlink
  243.      *   fuse_reply_err
  244.      *
  245.      * @param req request handle
  246.      * @param ino the inode number
  247.      */
  248.     void (*readlink) (fuse_req_t req, fuse_ino_t ino);
  249.  
  250.     /**
  251.      * Create file node
  252.      *
  253.      * Create a regular file, character device, block device, fifo or
  254.      * socket node.
  255.      *
  256.      * Valid replies:
  257.      *   fuse_reply_entry
  258.      *   fuse_reply_err
  259.      *
  260.      * @param req request handle
  261.      * @param parent inode number of the parent directory
  262.      * @param name to create
  263.      * @param mode file type and mode with which to create the new file
  264.      * @param rdev the device number (only valid if created file is a device)
  265.      */
  266.     void (*mknod) (fuse_req_t req, fuse_ino_t parent, const char *name,
  267.                    mode_t mode, dev_t rdev);
  268.  
  269.     /**
  270.      * Create a directory
  271.      *
  272.      * Valid replies:
  273.      *   fuse_reply_entry
  274.      *   fuse_reply_err
  275.      *
  276.      * @param req request handle
  277.      * @param parent inode number of the parent directory
  278.      * @param name to create
  279.      * @param mode with which to create the new file
  280.      */
  281.     void (*mkdir) (fuse_req_t req, fuse_ino_t parent, const char *name,
  282.                    mode_t mode);
  283.  
  284.     /**
  285.      * Remove a file
  286.      *
  287.      * Valid replies:
  288.      *   fuse_reply_err
  289.      *
  290.      * @param req request handle
  291.      * @param parent inode number of the parent directory
  292.      * @param name to remove
  293.      */
  294.     void (*unlink) (fuse_req_t req, fuse_ino_t parent, const char *name);
  295.  
  296.     /**
  297.      * Remove a directory
  298.      *
  299.      * Valid replies:
  300.      *   fuse_reply_err
  301.      *
  302.      * @param req request handle
  303.      * @param parent inode number of the parent directory
  304.      * @param name to remove
  305.      */
  306.     void (*rmdir) (fuse_req_t req, fuse_ino_t parent, const char *name);
  307.  
  308.     /**
  309.      * Create a symbolic link
  310.      *
  311.      * Valid replies:
  312.      *   fuse_reply_entry
  313.      *   fuse_reply_err
  314.      *
  315.      * @param req request handle
  316.      * @param link the contents of the symbolic link
  317.      * @param parent inode number of the parent directory
  318.      * @param name to create
  319.      */
  320.     void (*symlink) (fuse_req_t req, const char *link, fuse_ino_t parent,
  321.                      const char *name);
  322.  
  323.     /** Rename a file
  324.      *
  325.      * Valid replies:
  326.      *   fuse_reply_err
  327.      *
  328.      * @param req request handle
  329.      * @param parent inode number of the old parent directory
  330.      * @param name old name
  331.      * @param newparent inode number of the new parent directory
  332.      * @param newname new name
  333.      */
  334.     void (*rename) (fuse_req_t req, fuse_ino_t parent, const char *name,
  335.                     fuse_ino_t newparent, const char *newname);
  336.  
  337.     /**
  338.      * Create a hard link
  339.      *
  340.      * Valid replies:
  341.      *   fuse_reply_entry
  342.      *   fuse_reply_err
  343.      *
  344.      * @param req request handle
  345.      * @param ino the old inode number
  346.      * @param newparent inode number of the new parent directory
  347.      * @param newname new name to create
  348.      */
  349.     void (*link) (fuse_req_t req, fuse_ino_t ino, fuse_ino_t newparent,
  350.                   const char *newname);
  351.  
  352.     /**
  353.      * Open a file
  354.      *
  355.      * Open flags (with the exception of O_CREAT, O_EXCL, O_NOCTTY and
  356.      * O_TRUNC) are available in fi->flags.
  357.      *
  358.      * Filesystem may store an arbitrary file handle (pointer, index,
  359.      * etc) in fi->fh, and use this in other all other file operations
  360.      * (read, write, flush, release, fsync).
  361.      *
  362.      * Filesystem may also implement stateless file I/O and not store
  363.      * anything in fi->fh.
  364.      *
  365.      * There are also some flags (direct_io, keep_cache) which the
  366.      * filesystem may set in fi, to change the way the file is opened.
  367.      * See fuse_file_info structure in <fuse_common.h> for more details.
  368.      *
  369.      * Valid replies:
  370.      *   fuse_reply_open
  371.      *   fuse_reply_err
  372.      *
  373.      * @param req request handle
  374.      * @param ino the inode number
  375.      * @param fi file information
  376.      */
  377.     void (*open) (fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi);
  378.  
  379.     /**
  380.      * Read data
  381.      *
  382.      * Read should send exactly the number of bytes requested except
  383.      * on EOF or error, otherwise the rest of the data will be
  384.      * substituted with zeroes.  An exception to this is when the file
  385.      * has been opened in 'direct_io' mode, in which case the return
  386.      * value of the read system call will reflect the return value of
  387.      * this operation.
  388.      *
  389.      * fi->fh will contain the value set by the open method, or will
  390.      * be undefined if the open method didn't set any value.
  391.      *
  392.      * Valid replies:
  393.      *   fuse_reply_buf
  394.      *   fuse_reply_err
  395.      *
  396.      * @param req request handle
  397.      * @param ino the inode number
  398.      * @param size number of bytes to read
  399.      * @param off offset to read from
  400.      * @param fi file information
  401.      */
  402.     void (*read) (fuse_req_t req, fuse_ino_t ino, size_t size, off_t off,
  403.                   struct fuse_file_info *fi);
  404.  
  405.     /**
  406.      * Write data
  407.      *
  408.      * Write should return exactly the number of bytes requested
  409.      * except on error.  An exception to this is when the file has
  410.      * been opened in 'direct_io' mode, in which case the return value
  411.      * of the write system call will reflect the return value of this
  412.      * operation.
  413.      *
  414.      * fi->fh will contain the value set by the open method, or will
  415.      * be undefined if the open method didn't set any value.
  416.      *
  417.      * Valid replies:
  418.      *   fuse_reply_write
  419.      *   fuse_reply_err
  420.      *
  421.      * @param req request handle
  422.      * @param ino the inode number
  423.      * @param buf data to write
  424.      * @param size number of bytes to write
  425.      * @param off offset to write to
  426.      * @param fi file information
  427.      */
  428.     void (*write) (fuse_req_t req, fuse_ino_t ino, const char *buf,
  429.                    size_t size, off_t off, struct fuse_file_info *fi);
  430.  
  431.     /**
  432.      * Flush method
  433.      *
  434.      * This is called on each close() of the opened file.
  435.      *
  436.      * Since file descriptors can be duplicated (dup, dup2, fork), for
  437.      * one open call there may be many flush calls.
  438.      *
  439.      * Filesystems shouldn't assume that flush will always be called
  440.      * after some writes, or that if will be called at all.
  441.      *
  442.      * fi->fh will contain the value set by the open method, or will
  443.      * be undefined if the open method didn't set any value.
  444.      *
  445.      * NOTE: the name of the method is misleading, since (unlike
  446.      * fsync) the filesystem is not forced to flush pending writes.
  447.      * One reason to flush data, is if the filesystem wants to return
  448.      * write errors.
  449.      *
  450.      * Valid replies:
  451.      *   fuse_reply_err
  452.      *
  453.      * @param req request handle
  454.      * @param ino the inode number
  455.      * @param fi file information
  456.      */
  457.     void (*flush) (fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi);
  458.  
  459.     /**
  460.      * Release an open file
  461.      *
  462.      * Release is called when there are no more references to an open
  463.      * file: all file descriptors are closed and all memory mappings
  464.      * are unmapped.
  465.      *
  466.      * For every open call there will be exactly one release call.
  467.      *
  468.      * The filesystem may reply with an error, but error values are
  469.      * not returned to close() or munmap() which triggered the
  470.      * release.
  471.      *
  472.      * fi->fh will contain the value set by the open method, or will
  473.      * be undefined if the open method didn't set any value.
  474.      * fi->flags will contain the same flags as for open.
  475.      *
  476.      * Valid replies:
  477.      *   fuse_reply_err
  478.      *
  479.      * @param req request handle
  480.      * @param ino the inode number
  481.      * @param fi file information
  482.      */
  483.     void (*release) (fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi);
  484.  
  485.     /**
  486.      * Synchronize file contents
  487.      *
  488.      * If the datasync parameter is non-zero, then only the user data
  489.      * should be flushed, not the meta data.
  490.      *
  491.      * Valid replies:
  492.      *   fuse_reply_err
  493.      *
  494.      * @param req request handle
  495.      * @param ino the inode number
  496.      * @param datasync flag indicating if only data should be flushed
  497.      * @param fi file information
  498.      */
  499.     void (*fsync) (fuse_req_t req, fuse_ino_t ino, int datasync,
  500.                    struct fuse_file_info *fi);
  501.  
  502.     /**
  503.      * Open a directory
  504.      *
  505.      * Filesystem may store an arbitrary file handle (pointer, index,
  506.      * etc) in fi->fh, and use this in other all other directory
  507.      * stream operations (readdir, releasedir, fsyncdir).
  508.      *
  509.      * Filesystem may also implement stateless directory I/O and not
  510.      * store anything in fi->fh, though that makes it impossible to
  511.      * implement standard conforming directory stream operations in
  512.      * case the contents of the directory can change between opendir
  513.      * and releasedir.
  514.      *
  515.      * Valid replies:
  516.      *   fuse_reply_open
  517.      *   fuse_reply_err
  518.      *
  519.      * @param req request handle
  520.      * @param ino the inode number
  521.      * @param fi file information
  522.      */
  523.     void (*opendir) (fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi);
  524.  
  525.     /**
  526.      * Read directory
  527.      *
  528.      * Send a buffer filled using fuse_add_direntry(), with size not
  529.      * exceeding the requested size.  Send an empty buffer on end of
  530.      * stream.
  531.      *
  532.      * fi->fh will contain the value set by the opendir method, or
  533.      * will be undefined if the opendir method didn't set any value.
  534.      *
  535.      * Valid replies:
  536.      *   fuse_reply_buf
  537.      *   fuse_reply_err
  538.      *
  539.      * @param req request handle
  540.      * @param ino the inode number
  541.      * @param size maximum number of bytes to send
  542.      * @param off offset to continue reading the directory stream
  543.      * @param fi file information
  544.      */
  545.     void (*readdir) (fuse_req_t req, fuse_ino_t ino, size_t size, off_t off,
  546.                      struct fuse_file_info *fi);
  547.  
  548.     /**
  549.      * Release an open directory
  550.      *
  551.      * For every opendir call there will be exactly one releasedir
  552.      * call.
  553.      *
  554.      * Any errors sent by releasedir will be ignored.
  555.      *
  556.      * fi->fh will contain the value set by the opendir method, or
  557.      * will be undefined if the opendir method didn't set any value.
  558.      *
  559.      * Valid replies:
  560.      *   fuse_reply_err
  561.      *
  562.      * @param req request handle
  563.      * @param ino the inode number
  564.      * @param fi file information
  565.      */
  566.     void (*releasedir) (fuse_req_t req, fuse_ino_t ino,
  567.                         struct fuse_file_info *fi);
  568.  
  569.     /**
  570.      * Synchronize directory contents
  571.      *
  572.      * If the datasync parameter is non-zero, then only the directory
  573.      * contents should be flushed, not the meta data.
  574.      *
  575.      * fi->fh will contain the value set by the opendir method, or
  576.      * will be undefined if the opendir method didn't set any value.
  577.      *
  578.      * Valid replies:
  579.      *   fuse_reply_err
  580.      *
  581.      * @param req request handle
  582.      * @param ino the inode number
  583.      * @param datasync flag indicating if only data should be flushed
  584.      * @param fi file information
  585.      */
  586.     void (*fsyncdir) (fuse_req_t req, fuse_ino_t ino, int datasync,
  587.                       struct fuse_file_info *fi);
  588.  
  589.     /**
  590.      * Get file system statistics
  591.      *
  592.      * Valid replies:
  593.      *   fuse_reply_statfs
  594.      *   fuse_reply_err
  595.      *
  596.      * @param req request handle
  597.      */
  598.     void (*statfs) (fuse_req_t req);
  599.  
  600.     /**
  601.      * Set an extended attribute
  602.      *
  603.      * Valid replies:
  604.      *   fuse_reply_err
  605.      */
  606.     void (*setxattr) (fuse_req_t req, fuse_ino_t ino, const char *name,
  607.                       const char *value, size_t size, int flags);
  608.  
  609.     /**
  610.      * Get an extended attribute
  611.      *
  612.      * If size is zero, the size of the value should be sent with
  613.      * fuse_reply_xattr.
  614.      *
  615.      * If the size is non-zero, and the value fits in the buffer, the
  616.      * value should be sent with fuse_reply_buf.
  617.      *
  618.      * If the size is too small for the value, the ERANGE error should
  619.      * be sent.
  620.      *
  621.      * Valid replies:
  622.      *   fuse_reply_buf
  623.      *   fuse_reply_xattr
  624.      *   fuse_reply_err
  625.      *
  626.      * @param req request handle
  627.      * @param ino the inode number
  628.      * @param name of the extended attribute
  629.      * @param size maximum size of the value to send
  630.      */
  631.     void (*getxattr) (fuse_req_t req, fuse_ino_t ino, const char *name,
  632.                       size_t size);
  633.  
  634.     /**
  635.      * List extended attribute names
  636.      *
  637.      * If size is zero, the total size of the attribute list should be
  638.      * sent with fuse_reply_xattr.
  639.      *
  640.      * If the size is non-zero, and the null character separated
  641.      * attribute list fits in the buffer, the list should be sent with
  642.      * fuse_reply_buf.
  643.      *
  644.      * If the size is too small for the list, the ERANGE error should
  645.      * be sent.
  646.      *
  647.      * Valid replies:
  648.      *   fuse_reply_buf
  649.      *   fuse_reply_xattr
  650.      *   fuse_reply_err
  651.      *
  652.      * @param req request handle
  653.      * @param ino the inode number
  654.      * @param size maximum size of the list to send
  655.      */
  656.     void (*listxattr) (fuse_req_t req, fuse_ino_t ino, size_t size);
  657.  
  658.     /**
  659.      * Remove an extended attribute
  660.      *
  661.      * Valid replies:
  662.      *   fuse_reply_err
  663.      *
  664.      * @param req request handle
  665.      * @param ino the inode number
  666.      * @param name of the extended attribute
  667.      */
  668.     void (*removexattr) (fuse_req_t req, fuse_ino_t ino, const char *name);
  669.  
  670.     /**
  671.      * Check file access permissions
  672.      *
  673.      * This will be called for the access() system call.  If the
  674.      * 'default_permissions' mount option is given, this method is not
  675.      * called.
  676.      *
  677.      * This method is not called under Linux kernel versions 2.4.x
  678.      *
  679.      * Introduced in version 2.5
  680.      *
  681.      * Valid replies:
  682.      *   fuse_reply_err
  683.      *
  684.      * @param req request handle
  685.      * @param ino the inode number
  686.      * @param mask requested access mode
  687.      */
  688.     void (*access) (fuse_req_t req, fuse_ino_t ino, int mask);
  689.  
  690.     /**
  691.      * Create and open a file
  692.      *
  693.      * If the file does not exist, first create it with the specified
  694.      * mode, and then open it.
  695.      *
  696.      * Open flags (with the exception of O_NOCTTY) are available in
  697.      * fi->flags.
  698.      *
  699.      * Filesystem may store an arbitrary file handle (pointer, index,
  700.      * etc) in fi->fh, and use this in other all other file operations
  701.      * (read, write, flush, release, fsync).
  702.      *
  703.      * There are also some flags (direct_io, keep_cache) which the
  704.      * filesystem may set in fi, to change the way the file is opened.
  705.      * See fuse_file_info structure in <fuse_common.h> for more details.
  706.      *
  707.      * If this method is not implemented or under Linux kernel
  708.      * versions earlier than 2.6.15, the mknod() and open() methods
  709.      * will be called instead.
  710.      *
  711.      * Introduced in version 2.5
  712.      *
  713.      * Valid replies:
  714.      *   fuse_reply_create
  715.      *   fuse_reply_err
  716.      *
  717.      * @param req request handle
  718.      * @param parent inode number of the parent directory
  719.      * @param name to create
  720.      * @param mode file type and mode with which to create the new file
  721.      * @param fi file information
  722.      */
  723.     void (*create) (fuse_req_t req, fuse_ino_t parent, const char *name,
  724.                     mode_t mode, struct fuse_file_info *fi);
  725. };
  726.  
  727. /**
  728.  * Reply with an error code or success
  729.  *
  730.  * Possible requests:
  731.  *   all except forget
  732.  *
  733.  * unlink, rmdir, rename, flush, release, fsync, fsyncdir, setxattr
  734.  * and removexattr may send a zero code
  735.  *
  736.  * @param req request handle
  737.  * @param err the positive error value, or zero for success
  738.  * @return zero for success, -errno for failure to send reply
  739.  */
  740. int fuse_reply_err(fuse_req_t req, int err);
  741.  
  742. /**
  743.  * Don't send reply
  744.  *
  745.  * Possible requests:
  746.  *   forget
  747.  *
  748.  * @param req request handle
  749.  */
  750. void fuse_reply_none(fuse_req_t req);
  751.  
  752. /**
  753.  * Reply with a directory entry
  754.  *
  755.  * Possible requests:
  756.  *   lookup, mknod, mkdir, symlink, link
  757.  *
  758.  * @param req request handle
  759.  * @param e the entry parameters
  760.  * @return zero for success, -errno for failure to send reply
  761.  */
  762. int fuse_reply_entry(fuse_req_t req, const struct fuse_entry_param *e);
  763.  
  764. /**
  765.  * Reply with a directory entry and open parameters
  766.  *
  767.  * currently the following members of 'fi' are used:
  768.  *   fh, direct_io, keep_cache
  769.  *
  770.  * Possible requests:
  771.  *   create
  772.  *
  773.  * @param req request handle
  774.  * @param e the entry parameters
  775.  * @param fi file information
  776.  * @return zero for success, -errno for failure to send reply
  777.  */
  778. int fuse_reply_create(fuse_req_t req, const struct fuse_entry_param *e,
  779.                       const struct fuse_file_info *fi);
  780.  
  781. /**
  782.  * Reply with attributes
  783.  *
  784.  * Possible requests:
  785.  *   getattr, setattr
  786.  *
  787.  * @param req request handle
  788.  * @param the attributes
  789.  * @param attr_timeout  validity timeout (in seconds) for the attributes
  790.  * @return zero for success, -errno for failure to send reply
  791.  */
  792. int fuse_reply_attr(fuse_req_t req, const struct stat *attr,
  793.                     double attr_timeout);
  794.  
  795. /**
  796.  * Reply with the contents of a symbolic link
  797.  *
  798.  * Possible requests:
  799.  *   readlink
  800.  *
  801.  * @param req request handle
  802.  * @param link symbolic link contents
  803.  * @return zero for success, -errno for failure to send reply
  804.  */
  805. int fuse_reply_readlink(fuse_req_t req, const char *link);
  806.  
  807. /**
  808.  * Reply with open parameters
  809.  *
  810.  * currently the following members of 'fi' are used:
  811.  *   fh, direct_io, keep_cache
  812.  *
  813.  * Possible requests:
  814.  *   open, opendir
  815.  *
  816.  * @param req request handle
  817.  * @param fi file information
  818.  * @return zero for success, -errno for failure to send reply
  819.  */
  820. int fuse_reply_open(fuse_req_t req, const struct fuse_file_info *fi);
  821.  
  822. /**
  823.  * Reply with number of bytes written
  824.  *
  825.  * Possible requests:
  826.  *   write
  827.  *
  828.  * @param req request handle
  829.  * @param count the number of bytes written
  830.  * @return zero for success, -errno for failure to send reply
  831.  */
  832. int fuse_reply_write(fuse_req_t req, size_t count);
  833.  
  834. /**
  835.  * Reply with data
  836.  *
  837.  * Possible requests:
  838.  *   read, readdir, getxattr, listxattr
  839.  *
  840.  * @param req request handle
  841.  * @param buf buffer containing data
  842.  * @param size the size of data in bytes
  843.  * @return zero for success, -errno for failure to send reply
  844.  */
  845. int fuse_reply_buf(fuse_req_t req, const char *buf, size_t size);
  846.  
  847. /**
  848.  * Reply with filesystem statistics
  849.  *
  850.  * Possible requests:
  851.  *   statfs
  852.  *
  853.  * @param req request handle
  854.  * @param stbuf filesystem statistics
  855.  * @return zero for success, -errno for failure to send reply
  856.  */
  857. int fuse_reply_statfs(fuse_req_t req, const struct statvfs *stbuf);
  858.  
  859. /**
  860.  * Reply with needed buffer size
  861.  *
  862.  * Possible requests:
  863.  *   getxattr, listxattr
  864.  *
  865.  * @param req request handle
  866.  * @param count the buffer size needed in bytes
  867.  * @return zero for success, -errno for failure to send reply
  868.  */
  869. int fuse_reply_xattr(fuse_req_t req, size_t count);
  870.  
  871. /* ----------------------------------------------------------- *
  872.  * Filling a buffer in readdir                                 *
  873.  * ----------------------------------------------------------- */
  874.  
  875. /**
  876.  * Add a directory entry to the buffer
  877.  *
  878.  * Buffer needs to be large enough to hold the entry.  Of it's not,
  879.  * then the entry is not filled in but the size of the entry is still
  880.  * returned.  The caller can check this by comparing the bufsize
  881.  * parameter with the returned entry size.  If the entry size is
  882.  * larger than the buffer size, the operation failed.
  883.  *
  884.  * From the 'stbuf' argument the st_ino field and bits 12-15 of the
  885.  * st_mode field are used.  The other fields are ignored.
  886.  *
  887.  * Note: offsets do not necessarily represent physical offsets, and
  888.  * could be any marker, that enables the implementation to find a
  889.  * specific point in the directory stream.
  890.  *
  891.  * @param req request handle
  892.  * @param buf the point where the new entry will be added to the buffer
  893.  * @param bufsize remaining size of the buffer
  894.  * @param the name of the entry
  895.  * @param stbuf the file attributes
  896.  * @param off the offset of the next entry
  897.  * @return the space needed for the entry
  898.  */
  899. size_t fuse_add_direntry(fuse_req_t req, char *buf, size_t bufsize,
  900.                          const char *name, const struct stat *stbuf,
  901.                          off_t off);
  902.  
  903. /* ----------------------------------------------------------- *
  904.  * Utility functions                                           *
  905.  * ----------------------------------------------------------- */
  906.  
  907. /**
  908.  * Get the userdata from the request
  909.  *
  910.  * @param req request handle
  911.  * @return the user data passed to fuse_lowlevel_new()
  912.  */
  913. void *fuse_req_userdata(fuse_req_t req);
  914.  
  915. /**
  916.  * Get the context from the request
  917.  *
  918.  * The pointer returned by this function will only be valid for the
  919.  * request's lifetime
  920.  *
  921.  * @param req request handle
  922.  * @return the context structure
  923.  */
  924. const struct fuse_ctx *fuse_req_ctx(fuse_req_t req);
  925.  
  926. /* ----------------------------------------------------------- *
  927.  * Filesystem setup                                            *
  928.  * ----------------------------------------------------------- */
  929.  
  930. /* Deprecated, don't use */
  931. int fuse_lowlevel_is_lib_option(const char *opt);
  932.  
  933. /**
  934.  * Create a low level session
  935.  *
  936.  * @param args argument vector
  937.  * @param op the low level filesystem operations
  938.  * @param op_size sizeof(struct fuse_lowlevel_ops)
  939.  * @param userdata user data
  940.  * @return the created session object, or NULL on failure
  941.  */
  942. struct fuse_session *fuse_lowlevel_new(struct fuse_args *args,
  943.                                        const struct fuse_lowlevel_ops *op,
  944.                                        size_t op_size, void *userdata);
  945.  
  946. /**
  947.  * Create a kernel channel
  948.  *
  949.  * @param fd the file descriptor obtained from fuse_mount()
  950.  * @return the created channel object, or NULL on failure
  951.  */
  952. struct fuse_chan *fuse_kern_chan_new(int fd);
  953.  
  954. /* ----------------------------------------------------------- *
  955.  * Session interface                                           *
  956.  * ----------------------------------------------------------- */
  957.  
  958. /**
  959.  * Session operations
  960.  *
  961.  * This is used in session creation
  962.  */
  963. struct fuse_session_ops {
  964.     /**
  965.      * Hook to process a request (mandatory)
  966.      *
  967.      * @param data user data passed to fuse_session_new()
  968.      * @param buf buffer containing the raw request
  969.      * @param len request length
  970.      * @param ch channel on which the request was received
  971.      */
  972.     void (*process) (void *data, const char *buf, size_t len,
  973.                      struct fuse_chan *ch);
  974.  
  975.     /**
  976.      * Hook for session exit and reset (optional)
  977.      *
  978.      * @param data user data passed to fuse_session_new()
  979.      * @param val exited status (1 - exited, 0 - not exited)
  980.      */
  981.     void (*exit) (void *data, int val);
  982.  
  983.     /**
  984.      * Hook for querying the current exited status (optional)
  985.      *
  986.      * @param data user data passed to fuse_session_new()
  987.      * @return 1 if exited, 0 if not exited
  988.      */
  989.     int (*exited) (void *data);
  990.  
  991.     /**
  992.      * Hook for cleaning up the channel on destroy (optional)
  993.      *
  994.      * @param data user data passed to fuse_session_new()
  995.      */
  996.     void (*destroy) (void *data);
  997. };
  998.  
  999. /**
  1000.  * Create a new session
  1001.  *
  1002.  * @param op session operations
  1003.  * @param data user data
  1004.  * @return new session object, or NULL on failure
  1005.  */
  1006. struct fuse_session *fuse_session_new(struct fuse_session_ops *op, void *data);
  1007.  
  1008. /**
  1009.  * Assign a channel to a session
  1010.  *
  1011.  * Note: currently only a single channel may be assigned.  This may
  1012.  * change in the future
  1013.  *
  1014.  * If a session is destroyed, the assigned channel is also destroyed
  1015.  *
  1016.  * @param se the session
  1017.  * @param ch the channel
  1018.  */
  1019. void fuse_session_add_chan(struct fuse_session *se, struct fuse_chan *ch);
  1020.  
  1021. /**
  1022.  * Iterate over the channels assigned to a session
  1023.  *
  1024.  * The iterating function needs to start with a NULL channel, and
  1025.  * after that needs to pass the previously returned channel to the
  1026.  * function.
  1027.  *
  1028.  * @param se the session
  1029.  * @param ch the previous channel, or NULL
  1030.  * @return the next channel, or NULL if no more channels exist
  1031.  */
  1032. struct fuse_chan *fuse_session_next_chan(struct fuse_session *se,
  1033.                                          struct fuse_chan *ch);
  1034.  
  1035. /**
  1036.  * Process a raw request
  1037.  *
  1038.  * @param se the session
  1039.  * @param buf buffer containing the raw request
  1040.  * @param len request length
  1041.  * @param ch channel on which the request was received
  1042.  */
  1043. void fuse_session_process(struct fuse_session *se, const char *buf, size_t len,
  1044.                           struct fuse_chan *ch);
  1045.  
  1046. /**
  1047.  * Destroy a session
  1048.  *
  1049.  * @param se the session
  1050.  */
  1051. void fuse_session_destroy(struct fuse_session *se);
  1052.  
  1053. /**
  1054.  * Exit a session
  1055.  *
  1056.  * @param se the session
  1057.  */
  1058. void fuse_session_exit(struct fuse_session *se);
  1059.  
  1060. /**
  1061.  * Reset the exited status of a session
  1062.  *
  1063.  * @param se the session
  1064.  */
  1065. void fuse_session_reset(struct fuse_session *se);
  1066.  
  1067. /**
  1068.  * Query the exited status of a session
  1069.  *
  1070.  * @param se the session
  1071.  * @return 1 if exited, 0 if not exited
  1072.  */
  1073. int fuse_session_exited(struct fuse_session *se);
  1074.  
  1075. /**
  1076.  * Enter a single threaded event loop
  1077.  *
  1078.  * @param se the session
  1079.  * @return 0 on success, -1 on error
  1080.  */
  1081. int fuse_session_loop(struct fuse_session *se);
  1082.  
  1083. /**
  1084.  * Enter a multi-threaded event loop
  1085.  *
  1086.  * @param se the session
  1087.  * @return 0 on success, -1 on error
  1088.  */
  1089. int fuse_session_loop_mt(struct fuse_session *se);
  1090.  
  1091. /* ----------------------------------------------------------- *
  1092.  * Channel interface                                           *
  1093.  * ----------------------------------------------------------- */
  1094.  
  1095. /**
  1096.  * Channel operations
  1097.  *
  1098.  * This is used in channel creation
  1099.  */
  1100. struct fuse_chan_ops {
  1101.     /**
  1102.      * Hook for receiving a raw request
  1103.      *
  1104.      * @param ch the channel
  1105.      * @param buf the buffer to store the request in
  1106.      * @param size the size of the buffer
  1107.      * @return the actual size of the raw request, or -1 on error
  1108.      */
  1109.     int (*receive)(struct fuse_chan *ch, char *buf, size_t size);
  1110.  
  1111.     /**
  1112.      * Hook for sending a raw reply
  1113.      *
  1114.      * A return value of -ENOENT means, that the request was
  1115.      * interrupted, and the reply was discarded
  1116.      *
  1117.      * @param ch the channel
  1118.      * @param iov vector of blocks
  1119.      * @param count the number of blocks in vector
  1120.      * @return zero on success, -errno on failure
  1121.      */
  1122.     int (*send)(struct fuse_chan *ch, const struct iovec iov[],
  1123.                 size_t count);
  1124.  
  1125.     /**
  1126.      * Destroy the channel
  1127.      *
  1128.      * @param ch the channel
  1129.      */
  1130.     void (*destroy)(struct fuse_chan *ch);
  1131. };
  1132.  
  1133. /**
  1134.  * Create a new channel
  1135.  *
  1136.  * @param op channel operations
  1137.  * @param fd file descriptor of the channel
  1138.  * @param bufsize the minimal receive buffer size
  1139.  * @param data user data
  1140.  * @return the new channel object, or NULL on failure
  1141.  */
  1142. struct fuse_chan *fuse_chan_new(struct fuse_chan_ops *op, int fd,
  1143.                                 size_t bufsize, void *data);
  1144.  
  1145. /**
  1146.  * Query the file descriptor of the channel
  1147.  *
  1148.  * @param ch the channel
  1149.  * @return the file descriptor passed to fuse_chan_new()
  1150.  */
  1151. int fuse_chan_fd(struct fuse_chan *ch);
  1152.  
  1153. /**
  1154.  * Query the minimal receive buffer size
  1155.  *
  1156.  * @param ch the channel
  1157.  * @return the buffer size passed to fuse_chan_new()
  1158.  */
  1159. size_t fuse_chan_bufsize(struct fuse_chan *ch);
  1160.  
  1161. /**
  1162.  * Query the user data
  1163.  *
  1164.  * @param ch the channel
  1165.  * @return the user data passed to fuse_chan_new()
  1166.  */
  1167. void *fuse_chan_data(struct fuse_chan *ch);
  1168.  
  1169. /**
  1170.  * Query the session to which this channel is assigned
  1171.  *
  1172.  * @param ch the channel
  1173.  * @return the session, or NULL if the channel is not assigned
  1174.  */
  1175. struct fuse_session *fuse_chan_session(struct fuse_chan *ch);
  1176.  
  1177. /**
  1178.  * Receive a raw request
  1179.  *
  1180.  * A return value of -ENODEV means, that the filesystem was unmounted
  1181.  *
  1182.  * @param ch the channel
  1183.  * @param buf the buffer to store the request in
  1184.  * @param size the size of the buffer
  1185.  * @return the actual size of the raw request, or -errno on error
  1186.  */
  1187. int fuse_chan_recv(struct fuse_chan *ch, char *buf, size_t size);
  1188.  
  1189. /**
  1190.  * Send a raw reply
  1191.  *
  1192.  * A return value of -ENOENT means, that the request was
  1193.  * interrupted, and the reply was discarded
  1194.  *
  1195.  * @param ch the channel
  1196.  * @param iov vector of blocks
  1197.  * @param count the number of blocks in vector
  1198.  * @return zero on success, -errno on failure
  1199.  */
  1200. int fuse_chan_send(struct fuse_chan *ch, const struct iovec iov[],
  1201.                    size_t count);
  1202.  
  1203. /**
  1204.  * Destroy a channel
  1205.  *
  1206.  * @param ch the channel
  1207.  */
  1208. void fuse_chan_destroy(struct fuse_chan *ch);
  1209.  
  1210. /* ----------------------------------------------------------- *
  1211.  * Signal handling                                             *
  1212.  * ----------------------------------------------------------- */
  1213.  
  1214. /**
  1215.  * Exit session on HUP, TERM and INT signals and ignore PIPE signal
  1216.  *
  1217.  * Stores session in a global variable.  May only be called once per
  1218.  * process until fuse_remove_signal_handlers() is called.
  1219.  *
  1220.  * @param se the session to exit
  1221.  * @return 0 on success, -1 on failure
  1222.  */
  1223. int fuse_set_signal_handlers(struct fuse_session *se);
  1224.  
  1225. /**
  1226.  * Restore default signal handlers
  1227.  *
  1228.  * Resets global session.  After this fuse_set_signal_handlers() may
  1229.  * be called again.
  1230.  *
  1231.  * @param se the same session as given in fuse_set_signal_handlers()
  1232.  */
  1233. void fuse_remove_signal_handlers(struct fuse_session *se);
  1234.  
  1235. /* ----------------------------------------------------------- *
  1236.  * Compatibility stuff                                         *
  1237.  * ----------------------------------------------------------- */
  1238.  
  1239. #if FUSE_USE_VERSION < 26
  1240. #  include "fuse_lowlevel_compat.h"
  1241. #  undef FUSE_MINOR_VERSION
  1242. #  if FUSE_USE_VERSION == 25
  1243. #    define fuse_lowlevel_ops fuse_lowlevel_ops_compat25
  1244. #    define fuse_lowlevel_new fuse_lowlevel_new_compat25
  1245. #  elif FUSE_USE_VERSION == 24
  1246. #    define fuse_file_info fuse_file_info_compat
  1247. #    define fuse_reply_statfs fuse_reply_statfs_compat
  1248. #    define fuse_reply_open fuse_reply_open_compat
  1249. #  else 
  1250. #    error Compatibility with low-level API version < 24 not supported
  1251. #  endif
  1252. #endif
  1253.  
  1254. #ifdef __cplusplus
  1255. }
  1256. #endif
  1257.  
  1258. #endif /* _FUSE_LOWLEVEL_H_ */
  1259.